package com.crm.common.util;

/**
 * @Author renshaorong
 * @Date 2021/07/22 11:39 上午
 */
public class CheckPasswordUtils {

    /**
     * 密码是否是正序或反序连续或相同字符4位及以上
     * @param pwd
     * @return true为正确，false为错误。
     */
    public static boolean isPasswordContinuous(String pwd) {
        int count = 0;//正序次数
        int reverseCount = 0;//反序次数
        int eqCount = 0;//相同字符次数
        String[] strArr = pwd.split("");
        for(int i = 1 ; i < strArr.length-1 ; i ++) {//从1开始是因为划分数组时，第一个为空
            if(isPositiveContinuous(strArr[i],strArr[i+1])) {
                count ++;
            } else {
                count = 0;
            }

            if(isReverseContinuous(strArr[i],strArr[i+1])) {
                reverseCount ++;
            } else {
                reverseCount = 0;
            }

            if(isEqualContinuous(strArr[i],strArr[i+1])) {
                eqCount ++;
            }else{
                eqCount = 0;
            }

            if(count > 2 || reverseCount > 2 || eqCount > 2) break;

        }

        if(count > 2 || reverseCount > 2 || eqCount > 2) return false;

        return true;
    }

    /**
     * 是否是正序连续
     * @param str1
     * @param str2
     * @return
     */
    public static boolean isPositiveContinuous(String str1 , String str2) {
        if(str2.hashCode() - str1.hashCode() == 1) return true;
        return false;
    }

    /**
     * 是否是反序连续
     * @param str1
     * @param str2
     * @return
     */
    public static boolean isReverseContinuous(String str1 , String str2) {
        if(str2.hashCode() - str1.hashCode() == -1) return true;
        return false;
    }

    /**
     * 是否是相同字符
     * @param str1
     * @param str2
     * @return
     */
    public static boolean isEqualContinuous(String str1 , String str2) {
        if(str2.hashCode() == str1.hashCode()) return true;
        return false;
    }

    /**
     * - 字母区分大小写，可输入符号
     - 密码必须同时包含字母、数字和符号
     - 密码长度8-16位
     - 密码中不能存在连续4个及以上的数字或字母(如：1234、7654、abcd、defgh等)
     - 密码中不能包含个人手机号后4位
     * @param password 密码
     * @return true为正确，false为错误
     */
    public static boolean isPasswordAvailable(String password) {

//        String str = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[~!@#$%^&*()_+={}:\";'<>,.]).{8,16}";//必须同时包含字母数字并且是8-20位
        String str = "^(?=.*[a-z])(?=.*\\d)[\\s\\S]{8,16}$";//至少包含一位字母及数字 并且是8-16位

        if(password.matches(str)) {
            return isPasswordContinuous(password);
        }
        return false;
    }

    /**
     * 获取随机密码
     * @param len
     * @return
     */
    public static String getRandomPsw(int len) {
        // 1、定义基本字符串baseStr和出参password
        String password = null;
        String baseStr = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~@#$%&*_+";
        boolean flag = false;
        // 2、使用循环来判断是否是正确的密码
        while (!flag) {
            // 密码重置
            password = "";
            // 个数计数
            int a = 0,b = 0,c = 0,d = 0;
            for (int i = 0; i < len; i++) {
                int rand = (int) (Math.random() * baseStr.length());
                password+=baseStr.charAt(rand);
                if (0<=rand && rand<=9) {
                    a++;
                }
                if (10<=rand && rand<=35) {
                    b++;
                }
                if (36<=rand && rand<=61) {
                    c++;
                }
                if (62<=rand && rand<baseStr.length()) {
                    d++;
                }
            }
            // 3、判断是否是正确的密码（4类中仅一类为0，其他不为0）
            flag = (a*b*c!=0&&d==0)||(a*b*d!=0&&c==0)||(a*c*d!=0&&b==0)||(b*c*d!=0&&a==0);
        }
        return password;
    }

}
